package com.atguigu.exam.controller;

import com.atguigu.exam.common.Result;
import com.atguigu.exam.entity.Notice;
import com.atguigu.exam.service.NoticeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import kotlin.jvm.internal.Lambda;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 公告控制器 - 处理系统公告管理相关的HTTP请求
 * 包括公告的增删改查、状态管理、前台展示等功能
 */
@Slf4j
@RestController  // REST控制器，返回JSON数据
@RequestMapping("/api/notices")  // 公告API路径前缀
@CrossOrigin  // 允许跨域访问
@Tag(name = "公告管理", description = "系统公告相关操作，包括公告发布、编辑、删除、状态管理等功能")  // Swagger API分组
public class NoticeController {
    @Autowired
    private NoticeService noticeService;

    //切换公告状态
    @PutMapping("toggle/{id}")
    @Operation(summary = "更新公告状态成功")
    public Result toggleNoticeStatus(
            @Parameter(description = "公告ID") @PathVariable Long id,
            @Parameter(description = "是否启用，true为启用，false为禁用") @RequestParam Boolean isActive){
        //1.构造更新公告状态的条件
        LambdaUpdateWrapper<Notice> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.eq(Notice::getId,id);
        lambdaUpdateWrapper.set(Notice::getIsActive,isActive);
        //2.直接使用service相关方法
        boolean result = noticeService.update(lambdaUpdateWrapper);
        return Result.success("更新公共状态成功");
    }

    //更新公告信息
    @PutMapping("update")
    @Operation(summary = "更新公告信息")
    public Result updateNotice(@RequestBody Notice notice){
        //1.调用业务层方法
        noticeService.updateNotice(notice);
        //2.拼接返回结果
        log.info("更新公告信息成功，结果为{}",notice);
        return Result.success("更新公告信息成功");
    }

    //发布新公告
    @PostMapping("add")
    @Operation(summary = "发布新公告")
    public Result addNotice(@RequestBody Notice notice){
        //1.调用业务层方法
        noticeService.addNotice(notice);
        //2.拼接返回结果
        log.info("添加新公告成功");
        return Result.success("添加新公告成功");
    }

    //获取所有公告
    @GetMapping("list")
    @Operation(summary = "获取所有公告")
    public Result getAllNotices(){
        //1.获取所有公告列表，包括启用和禁用的，无需构造查询条件
        List<Notice> noticeList = noticeService.list();
        //2.进行结果拼接
        log.info("查询所有公告列表信息执行成功，结果为{}",noticeList);
        return Result.success(noticeList,"查询所有公告列表信息成功");
    }

    //根据ID获取公告
    @GetMapping("{id}")
    @Operation(summary = "根据ID获取公告")
    public Result getNoticeDetails(@PathVariable Integer id){
        //1.构造查询条件
        LambdaQueryWrapper<Notice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Notice::getId,id);
        //2.单表查询，直接使用service相关方法
        Notice notice = noticeService.getOne(lambdaQueryWrapper);
        //3.进行结果拼接
        if (notice!=null){
            log.info("查询所有后台需要的轮播图信息业务执行成功，结果为{}",notice);
            return Result.success(notice,"查询公告信息成功");
        }
        return Result.error("查询公告信息失败");
    }

    //获取启用的公告
    @GetMapping("active")
    @Operation(summary = "获取启用的公告")
    public Result getActiveNotices(){
        //1.构造查询条件
        LambdaQueryWrapper<Notice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Notice::getIsActive,1);
        //2.单表查询，直接使用service相关方法
        List<Notice> noticeList = noticeService.list(lambdaQueryWrapper);
        //3.进行结果拼接
        log.info("查询所有启用的公告列表信息执行成功，结果为{}",noticeList);
        return Result.success(noticeList,"查询所有启用的公告列表信息成功");
    }

    //获取最新公告
    @GetMapping("latest")
    @Operation(summary = "获取最新公告")
    public Result getLatestNotice(@Parameter(description = "限制数量") Integer limit){
        //1.构造查询条件
        LambdaQueryWrapper<Notice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Notice::getIsActive,1);
        lambdaQueryWrapper.orderByDesc(Notice::getUpdateTime);
        lambdaQueryWrapper.last(limit!=0,"Limit "+limit);
        //2.单表查询，直接使用service相关方法
        List<Notice> noticeList = noticeService.list(lambdaQueryWrapper);
        //3.拼接返回结果
        return Result.success(noticeList,"获取最新公告成功");
    }

    //删除公告
    @DeleteMapping("delete/{id}")
    @Operation(summary = "删除公告")
    public Result deleteNotice(@PathVariable Long id){
        //1.构造删除条件
        LambdaQueryWrapper<Notice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Notice::getId,id);
        //2.单表删除操作，直接使用service相关方法
        boolean result = noticeService.remove(lambdaQueryWrapper);
        //3.拼接结果
        if(result){
            log.info("删除公告成功，删除的公告id为{}",id);
            return Result.success("根据ID删除公告成功");
        }
        return Result.error("根据ID删除公告删除失败");
    }
} 